package cn.sc.summer.domain.user;

import cn.hutool.core.lang.tree.Tree;
import cn.sc.summer.constant.model.PageResult;
import cn.sc.summer.feign.vo.UserInfoFeignVO;
import cn.sc.summer.protocol.form.SysRegistrationForm;
import cn.sc.summer.protocol.form.user.SysUserInfoPageForm;
import cn.sc.summer.protocol.form.user.SysUserInfoUpdateForm;
import cn.sc.summer.protocol.form.user.UserChangePasswordForm;
import cn.sc.summer.protocol.form.user.UserRoleForm;
import cn.sc.summer.protocol.vo.UserInfoVO;
import cn.sc.summer.token.po.AuthorityX;

import java.util.List;
import java.util.Set;

/**
 * 类名：sys-service类
 *
 * @author a-xin
 * @date 2023/8/29 20:15
 */
public interface SysUserInfoService {

    /**
     * 接口: 获取所有用户信息
     *
     * @return List<UserInfo>
     * @author a-xin
     * @date 2023/9/3 13:04
     */
    PageResult<UserInfoVO> getAllUsers(SysUserInfoPageForm form);

    /**
     * 接口: 用户注册WEB
     *
     * @param form 注册表单信息
     * @return cn.sc.summer.daoapi.po.UserInfo
     * @author a-xin
     * @date 2023/9/3 13:11
     */
    UserInfoVO registrationWeb(SysRegistrationForm form);

    /**
     * 接口: feign-根据用户电话查询用户信息
     *
     * @param phone 用户手机号
     * @return cn.sc.summer.daoapi.po.UserInfo 用户信息
     * @author a-xin
     * @date 2023/9/11 11:07
     */
    UserInfoFeignVO getUserInfoByPhone(String phone);

    /**
     * 用户忘记密码
     *
     * @param form 忘记密码提交表单
     * @return 成功与否
     */
    String forgetPassword(UserChangePasswordForm form);

    /**
     * 用户修改密码
     *
     * @param form 忘记密码提交表单
     * @return 成功与否
     */
    String changePassword(UserChangePasswordForm form);

    /**
     * 获取登录用户信息
     *
     * @return 登录用户信息
     */
    UserInfoVO getUserInfo();

    /**
     * 删除用户
     *
     * @param id 用户ID
     */
    void deleteUser(String id);

    /**
     * 更新当前用户信息
     *
     * @param form 更新提交表单
     * @return 更新后用户信息
     */
    UserInfoVO updateUser(SysUserInfoUpdateForm form);

    /**
     * 获取登录用户路由信息
     *
     * @return 路由树结构
     */
    List<Tree<String>> getUserRoute();

    /**
     * 接口: 用户注册APP
     *
     * @param form 注册表单信息
     * @return cn.sc.summer.daoapi.po.UserInfo
     * @author a-xin
     * @date 2023/9/3 13:11
     */
    UserInfoVO registrationApp(SysRegistrationForm form);

    /**
     * 缓存登录用户的api权限信息
     *
     * @param userId    用户ID
     * @param loginType 登录类型
     */
    Set<AuthorityX> getUserAuth(String userId, String loginType);

    /**
     * 用户绑定角色
     *
     * @param form 用户角色信息
     * @return 是否操作成功
     */
    Boolean userBindRole(UserRoleForm form);

    /**
     * 用户取消绑定角色
     *
     * @param form 用户角色信息
     * @return 是否操作成功
     */
    Boolean userUnBindRole(UserRoleForm form);
}
